Jackson এর @JsonManagedReference এবং @JsonBackReference অ্যানোটেশন দুটি Circular Reference সমস্যার সমাধান করতে ব্যবহৃত হয়, বিশেষত যখন এক ক্লাস অন্য ক্লাসের সাথে bi-directional relationship থাকে (যেমন Parent-Child)। এই অ্যানোটেশনগুলো একটি reference management সিস্টেম সরবরাহ করে, যা JSON Serialization এবং Deserialization-এর সময় circular references এড়াতে সাহায্য করে।
@JsonManagedReference এবং @JsonBackReference এর কার্যপদ্ধতি:
@JsonManagedReference: এটি Parent ক্লাসের সেই প্রপার্টি বা ফিল্ডে ব্যবহার করা হয়, যা child object রেফার করে।@JsonBackReference: এটি Child ক্লাসের সেই প্রপার্টি বা ফিল্ডে ব্যবহার করা হয়, যা parent object রেফার করে।
@JsonManagedReference এবং @JsonBackReference একে অপরের সাথে কাজ করে যাতে একটি circular reference JSON Serialization-এর সময় ব্লক না হয়।
প্র্যাকটিক্যাল উদাহরণ:
১. Parent এবং Child ক্লাস
ধরা যাক, একটি Person (Parent) এবং Address (Child) ক্লাসের মধ্যে bi-directional relationship রয়েছে। Person ক্লাসের একটি Address ফিল্ড রয়েছে, এবং Address ক্লাসের একটি Person ফিল্ড রয়েছে।
Person ক্লাস (Parent):
import com.fasterxml.jackson.annotation.JsonManagedReference;
public class Person {
private String name;
private Address address;
// Constructor
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonManagedReference
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address ক্লাস (Child):
import com.fasterxml.jackson.annotation.JsonBackReference;
public class Address {
private String street;
private String city;
private Person person;
// Constructor
public Address(String street, String city, Person person) {
this.street = street;
this.city = city;
this.person = person;
}
// Getters and Setters
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@JsonBackReference
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonManagedBackReferenceExample {
public static void main(String[] args) throws Exception {
// Address and Person Object Creation
Person person = new Person("John Doe", new Address("123 Elm St", "Springfield", null));
Address address = person.getAddress();
address.setPerson(person);
// Jackson ObjectMapper to convert to JSON
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(person);
System.out.println("Serialized JSON: " + json);
}
}
JSON Output:
{
"name": "John Doe",
"address": {
"street": "123 Elm St",
"city": "Springfield"
}
}
ব্যাখ্যা:
- এখানে,
@JsonManagedReferenceএবং@JsonBackReferenceব্যবহৃত হয়েছে Circular Reference সমস্যা প্রতিরোধ করার জন্য। @JsonManagedReferencePersonক্লাসেaddressফিল্ডে ব্যবহার করা হয়েছে, যা child অবজেক্টAddressরেফার করে।@JsonBackReferenceAddressক্লাসেpersonফিল্ডে ব্যবহার করা হয়েছে, যা parent অবজেক্টPersonরেফার করে।- এইভাবে,
addressএবংpersonপরস্পরের মধ্যে সঠিকভাবে রেফারেন্সিং সম্পন্ন হলেও Circular Reference তৈরি হয়নি।
@JsonManagedReference এবং @JsonBackReference এর অন্যান্য ব্যবহারের উদাহরণ:
Multiple Child Objects
আপনি যদি একাধিক child objects নিয়ে কাজ করেন, তাও এই অ্যানোটেশন ব্যবহার করা যেতে পারে।
import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.util.List;
public class Department {
private String name;
@JsonManagedReference
private List<Employee> employees;
// Constructor, Getters, Setters
}
public class Employee {
private String name;
@JsonBackReference
private Department department;
// Constructor, Getters, Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class DepartmentEmployeeExample {
public static void main(String[] args) throws Exception {
Department dept = new Department("HR", List.of(new Employee("John", null), new Employee("Jane", null)));
dept.getEmployees().get(0).setDepartment(dept);
dept.getEmployees().get(1).setDepartment(dept);
// Jackson ObjectMapper to convert to JSON
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(dept);
System.out.println("Serialized JSON: " + json);
}
}
JSON Output:
{
"name": "HR",
"employees": [
{
"name": "John"
},
{
"name": "Jane"
}
]
}
@JsonManagedReference এবং @JsonBackReference এর সুবিধা:
- Circular Reference এড়ানো:
- JSON Serialization এবং Deserialization-এর সময় Circular References থেকে সমস্যা এড়াতে সহায়তা করে।
- Bidirectional Relationships Handling:
- Parent-Child রিলেশনশিপে সহজেই bi-directional reference manage করা যায়।
- Performance Optimization:
- একটি reference কে flat JSON আউটপুটে পরিবর্তন করা হয়, ফলে মেমোরি ব্যবহারে সাশ্রয় হয় এবং পারফরম্যান্স উন্নত হয়।
@JsonManagedReferenceএবং@JsonBackReferenceদুটি অ্যানোটেশন একসাথে ব্যবহার করা হয় bi-directional relationships-এর Circular Reference সমস্যা সমাধান করার জন্য।- এগুলি parent-child সম্পর্কের মধ্যে ডেটা সিরিয়ালাইজেশনে সহজ ও কার্যকর উপায় প্রদান করে, যেখানে একে অপরকে রেফার করা হয়।
- Jackson এর এই অ্যানোটেশন দুটি JSON প্রসেসিংকে আরও নিরাপদ, পরিষ্কার এবং কার্যকর করে তোলে।
Read more